package cn.xdf.learn.leetcode;


import java.util.concurrent.atomic.AtomicLong;

/**
 * 你写一个26字母和0-9数字 不同长度组合
 * （设置一个长度 6 ，比如aabb99,aaaaaa等是输出内容,顺序不同也算）的输出，
 * 输出全部的时间不能超过2个小时。
 * 需要用多线程（不用参考网络的代码有问题的，是以前面试人员写的放到网络上的）
 */

public class Cloud {
    static char[] letter = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
            'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    /**
     * 统计个数
     */
    static AtomicLong atomicLong = new AtomicLong(0);


    public static void main(String[] args) {
        for (int i = 0; i < letter.length; i++) {
            assemble1(letter[i]);
        }


    }




    /**
     * 开启多线程
     * @param c1
     * @return
     */
    private static String assemble1(char c1) {
        for (int i = 0; i <= letter.length; i++) {
            int finalI = i;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //assemble2(c1, letter[finalI], 0);
                    char[] output = new char[6];
                    output[0] = c1;             //数组0位置的值
                    output[1] = letter[finalI]; //数组1位置的值
                    assembleData(output, 2);//数组后面的值
                    System.out.println("数量：" + atomicLong.get());
                }
            }).start();
        }
        return "";
    }

    /**
     * 生成数组后四位
     * @param chars
     * @param index
     * @return
     */
    private static char[] assembleData(char[] chars, int index) {

        if (index >= 6) {
            //计数
            atomicLong.incrementAndGet();
            //跳出递归、打印数据
            //System.out.println(String.valueOf(chars));
            return chars;
        }

        //下一层级数据
        int nextIndex = index + 1;

        for (int i = 0; i < letter.length; i++) {
            int finalIndex = index;
            int finalI = i;
            chars[finalIndex] = letter[finalI];
            assembleData(copyArray(chars), nextIndex);
        }


        return chars;

    }



    /**
     * 复制数组
     *
     * @param chars
     * @return
     */
    private static char[] copyArray(char[] chars) {
        char[] newChars = new char[6];
        for (int i = 0; i < chars.length; i++) {
            newChars[i] = chars[i];
        }
        return newChars;

    }


}

